//#include <string>
//#include <iostream>
//using namespace std;
//
//class String {
//public:
//	String() : pStr (0) {}
//	String(const char* str) { 
//		pStr = new char[strlen(str) + 1];
//		strcpy(pStr, str);
//	}
//
//	~String() {
//		if(pStr != NULL) {
//			delete[] pStr;
//			pStr = NULL;
//		}
//	}
//
//	String(const String& other) {
//		pStr = new char[strlen(other.pStr) + 1];
//		strcpy(pStr, other.pStr);
//	}
//
//	String& operator=(const String& other) {
//		if(this != &other) {
//			delete[] pStr;
//
//			pStr = new char[strlen(other.pStr) + 1];
//			strcpy(pStr, other.pStr);
//		}
//
//		return *this;
//	}
//
//	bool operator==(const String& other) const {
//		return strcmp(pStr, other.pStr) == 0;
//	}
//
//	char& operator[](int index) {
//		if(index < 0 || index >= strlen(pStr))
//			throw out_of_range("Tahat");
//
//		return pStr[index];
//	}
//
//	char operator[](int index) const {
//		if(index < 0 || index >= strlen(pStr))
//			throw out_of_range("Tahat");
//
//		return pStr[index];
//	}
//
//private:
//	char* pStr;
//};
//
//
//void main() {
//	try {
//		String s1("Hello");
//		String s2("Hello");
//		String s3("Quak");
//
//		bool res = s1 == s2;
//		res = s1 == s3;
//
//		s1 = s3;
//
//		String s4 = s1;
//
//		s2[1] = 'E';
//		cout << s2[1] << endl;
//
//		const String& s5 = s2;
//		cout << s5[2] << endl;
//
//		s1[17] = 'T';
//	}
//	catch(const out_of_range& err) {
//		cout<<err.what()<<endl;
//	}
//}